<?php
class Tetel extends AppModel {

	var $name = 'Tetel';
	var $validate = array(
		//'bizonylat_id' => array('numeric'),	//nem ellenőrizhető, a saveAll gondoskodik róla ugyan,
															//hogy meglegyen de ha ez itt van akkor a bizonylatot
															//nem tudja elmenteni, mivel a validates valószínűleg
															//hamarabb fut le, minthoyg az id beállításra kerülne
		'sorszam' => array('numeric'),
		'szoveg' => array('rule' => array('custom', '/[\w\s\(\)\+\-]*/')),		//szám, betű, _, szóköz, ()+-
		'osszeg' => array('rule' => array('custom', '/\d+[\.\,]?\d{0,2}/')),
		't' => array('numeric'),
		'k' => array('numeric'),
		'spec' => array('alphaNumeric')
	);

	//The Associations below have been created with all possible keys, those that are not needed can be removed
	var $belongsTo = array(
			'Bizonylat' => array('className' => 'Bizonylat',
								'foreignKey' => 'bizonylat_id',
								'conditions' => '',
								'fields' => '',
								'order' => ''
			),
			'TartozikSzamla' => array('className' => 'Szamla',
								'foreignKey' => 't',
								'conditions' => '',
								'fields' => '',
								'order' => ''
			),
			'KovetelSzamla' => array('className' => 'Szamla',
								'foreignKey' => 'k',
								'conditions' => '',
								'fields' => '',
								'order' => ''
			)
	);
	
	var $hasOne = array(
			'Valutatetel' => array(
									'className'    => 'Valutatetel',
									'foreignKey' => 'tetel_id',
									'dependent'    => false
									)
			);  

	var $hasAndBelongsToMany = array(
			'Gyujto' => array('className' => 'Gyujto',
						'joinTable' => 'gyujtok_tetelek',
						'foreignKey' => 'tetel_id',
						'associationForeignKey' => 'gyujto_id',
						'unique' => true,
						'conditions' => '',
						'fields' => '',
						'order' => '',
						'limit' => '',
						'offset' => '',
						'finderQuery' => '',
						'deleteQuery' => '',
						'insertQuery' => ''
			)
	);


	function getEgyenleg($naploId, $ev, $bizonylatIdig = null){
		$bizonylatIdFeltetel = $bizonylatIdig ? 'AND bizonylatok.id <= ' . $bizonylatIdig : '';
			
		$sql = 	'SELECT SUM(tetelek.osszeg) AS egyenleg, (tetelek.t = naplok.alapertelmezett_szamla) AS tartozik
						FROM tetelek
						LEFT JOIN bizonylatok ON bizonylatok.id = tetelek.bizonylat_id
						LEFT JOIN naplok ON bizonylatok.naplo_id = naplok.id
						WHERE naplok.id = '.$naploId.'
						'.$bizonylatIdFeltetel.'
						AND (
							tetelek.t = naplok.alapertelmezett_szamla
							OR tetelek.k = naplok.alapertelmezett_szamla
						)
						AND YEAR(bizonylatok.datum) = '.$ev.'
						AND tetelek.spec != "d"
						GROUP BY tartozik
						ORDER BY tartozik DESC';			
						
		
		$egyenleg['tegyenleg'] = 0;
		$egyenleg['kegyenleg'] = 0;

		$egyenlegek = $this->query($sql);
		foreach($egyenlegek as $e){
			if($e[0]['tartozik'])
				$egyenleg['tegyenleg'] = $e[0]['egyenleg'];
			else
				$egyenleg['kegyenleg'] = $e[0]['egyenleg'];
		}
		return($egyenleg);
	}

/**
 * Utolsó könyvelési dátum egy adott számlatartományra
 *
 * @param int $szamla a keresett számla tartomány
 * @return string a keresett dátum
*/
	function getLastKonyveltDatum($szamla, $params){
		if(!$params['ev'] || !$params['cegId']){
			throw new NotImplementedException('Hiányzik a Tetel->getLastKonyveltDatum hívásnál az év vagy a cegId!');
		}
		$eredmeny = Cache::read('lastKonyveltDatum'.$szamla.$params['ev'].$params['cegId'], 'short');
		if(!$eredmeny){
			$h = strlen($szamla);
			$this->unbindModel(array('hasOne' => array('Valutatetel'), 'hasAndBelongsToMany' => array('Gyujto')));
			$eredmeny = $this->find('first',
												array(
														'fields' => 'Bizonylat.datum',
														'order' => 'Bizonylat.datum DESC',
														'conditions' => array(
																				'YEAR(Bizonylat.datum)' => $params['ev'],
																				'TartozikSzamla.ceg_id' => array(0, $params['cegId']),
																				'OR' => array('LEFT(TartozikSzamla.szam,'.$h.')' => $szamla,
																									'LEFT(KovetelSzamla.szam,'.$h.')' => $szamla))));
			Cache::write('lastKonyveltDatum'.$szamla.$params['ev'].$params['cegId'], $eredmeny, 'short');
		}
		if($eredmeny)
			return $eredmeny['Bizonylat']['datum'];
		else
			return false;
	}

/**
 * Összes forgalom egyenlege az adott számlákon lekérdezése
 *
 * @param int $szla számla szám
 * @param array $params év és cég id
 * @return float összes pénzkészlet
*/
	function getOsszes($szla, $params){
		if(!$params['ev'] || !$params['cegId']){
			throw new NotImplementedException('Hiányzik a Tetel->getLastKonyveltDatum hívásnál az év vagy a cegId!');
		}

		App::uses('SzamlaSzamSQL', 'Utility');
		$szamlaSzamSQL = new SzamlaSzamSQL();
		$szamlaTartomany = $szamlaSzamSQL->createSzamlaTartomanySql($szla);

		$eredmeny = $this->query('SELECT *
											FROM (
												(SELECT SUM(osszeg) AS tOsszeg
													FROM `tetelek` , bizonylatok, szamlak
													WHERE bizonylatok.id = tetelek.bizonylat_id
													AND szamlak.id = tetelek.t
													AND YEAR( bizonylatok.datum ) = "'.$params['ev'].'"
													AND szamlak.ceg_id IN ( 0, '.$params['cegId'].')
													AND tetelek.spec != "d"
													AND ('.$szamlaTartomany.')
												) AS t1),
												(
												(SELECT SUM(osszeg) AS kOsszeg
												FROM `tetelek` , bizonylatok, szamlak
												WHERE bizonylatok.id = tetelek.bizonylat_id
												AND szamlak.id = tetelek.k
												AND YEAR( bizonylatok.datum ) = "'.$params['ev'].'"
												AND szamlak.ceg_id IN ( 0, '.$params['cegId'].')
												AND tetelek.spec != "d"
												AND ('.$szamlaTartomany.')
												) AS t2)'
												);
		//debug($eredmeny);
		return ($eredmeny[0]['t1']['tOsszeg'] - $eredmeny[0]['t2']['kOsszeg']);
	}
}
?>